package work.jame.blog.configuration;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import work.jame.blog.framework.exception.ProjectException;
import work.jame.blog.framework.exception.certificate.VerificationCodeException;
import work.jame.blog.framework.exception.user.NewIpLoginException;
import work.jame.blog.framework.exception.user.UserAuthenticationException;
import work.jame.blog.framework.result.Result;

import java.util.Objects;

/**
 * 全局异常处理
 * 如果异常需要特殊处理则添加一个对应的异常处理方法
 * <p>
 * 如果没有特殊的处理,例如业务错误(用户不能关注自己)之类的异常
 * 只是给用户一个提示,可直接使用ProjectException的异常处理方法
 *
 * @author : Jame
 * @date : 2023-05-09 13:46
 **/
@RestControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 参数校验异常
     *
     * @param exception MethodArgumentNotValidException异常类
     * @return 响应结果
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result<?> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException exception) {
        String message = Objects.requireNonNull(exception.getBindingResult().getFieldError()).getDefaultMessage();
        return Result.fail(message);
    }


    /**
     * 用户认证异常
     *
     * @param exception UserAuthenticationException异常类
     * @return 响应结果
     */
    @ExceptionHandler(UserAuthenticationException.class)
    public Result<?> userAuthenticationExceptionHandler(UserAuthenticationException exception) {
        return Result.create(exception.getFailNumber(), HttpStatus.UNAUTHORIZED.value(), exception.getMessage());
    }

    /**
     * 验证码异常
     *
     * @param exception VerificationCodeException异常类
     * @return 响应结果
     */
    @ExceptionHandler(VerificationCodeException.class)
    public Result<?> verificationCodeExceptionHandler(VerificationCodeException exception) {
        return Result.fail(exception.getMessage());
    }

    /**
     * 新ip登录异常
     *
     * @param exception NewIpLoginException
     * @return 响应结果
     */
    @ExceptionHandler(NewIpLoginException.class)
    public Result<?> newIpLoginExceptionHandler(NewIpLoginException exception) {
        return Result.fail("newIpLogin", exception.getMessage());
    }


    /**
     * 项目异常总类
     *
     * @param exception projectExceptionHandler
     * @return 响应结果
     */
    @ExceptionHandler(ProjectException.class)
    public Result<?> projectExceptionHandler(ProjectException exception) {
        return Result.fail(exception.getMessage());
    }

}
